package org.example.leetcode;


import java.util.Stack;

/**
 * @author: lynn
 * @Descript: 链表值+1
 * 链表的头插和尾插： https://blog.csdn.net/u014532775/article/details/90648623
 * @date: 2021/7/11 10:40
 * @version: 1.0
 */
public class LC369 {
    public static void main(String[] args) {
        ListNode l1=new ListNode(9);
        l1.next=new ListNode(9);
        l1.next.next=new ListNode(9);
        ListNode l2=plusOne(l1,1);
        System.out.println("xxxx");
    }

    /**
     * fixme 头插和尾插的区别 head永远存储第一个节点的地址，tail永远存储最后一个节点的地址
     ListNode newNode=new ListNode(mod);
     * 头插法
     //将新节点连接到链表的头部
     newNode.next=header;
     //header永远存储第一个节点的地址
     header=newNode;


     *尾插法
     //将新节点连接到链表的尾部
     tailNode.next=newNode;
     //tailNode 永远存储最后一个节点的地址
     tailNode=newNode;

     */
    private static ListNode plusOne(ListNode listNode,int value){
        if (listNode==null) return listNode;
        Stack<Integer> stack=new Stack<>();
        ListNode dummyNode=new ListNode(0);
        ListNode tail=dummyNode;
        ListNode head=dummyNode;

        while (listNode!=null){
            stack.push(listNode.val);
            listNode=listNode.next;
        }
        int carryBin=0;
        int tmp=0;
        Boolean flag=true;
        while (stack.size()!=0||carryBin!=0){
            tmp=stack.size()>0?stack.pop():0;
          int mod=0;
          if (flag){ //fixme value的值只加一次
              mod=(tmp+carryBin+value)%10;
              carryBin=(tmp+carryBin+value)/10;
          }else {
              mod=(tmp+carryBin)%10;
              carryBin=(tmp+carryBin)/10;
          }
          flag=false;
          ListNode newNode=new ListNode(mod);
           /** 将新节点连接到链表的头部
           newNode.next=dummyNode.next;
           //header永远存储第一个节点的地址
           dummyNode.next=newNode;
           */

            /**
             * 头插法
             * ListNode dummyNode=new ListNode(0);
             * ListNode tail=dummyNode;
             * ListNode head=dummyNode;
             */
            newNode.next=head.next;
            head.next=newNode;

            /**
             * 尾插法
             */
            /*tail.next=newNode;
            tail=tail.next;*/

        }
        return dummyNode.next ;
    }


    private static  class  ListNode{
        int val;
        ListNode next;
        ListNode(int val){
            this.val=val;
        }
    }
}
